#ifndef __MENU_H__
#define __MENU_H__


#include "bsp.h"

typedef void (*Callback_t)(void);

// 菜单状态枚举: 定义了菜单及应用程序的不同运行状态
typedef enum
{
    UI_PAGE_INIT,       // 菜单初始化状态
    UI_PAGE_DRAWING,    // 菜单绘制状态
    UI_PAGE_RUNING,        // 菜单运行状态
} MenuState_e;

typedef enum
{
    ITEM_NO, // 空
    ITEM_TREE, // 目录
    ITEM_BLOB, // 文件 
    ITEM_SWITCH, // 开关
    ITEM_CHECKBOX, // 复选框
    ITEM_CHANGE_VALUE, // 变量
    ITEM_PROGRESS_BAR, // 进度条
}ItemType_e;

typedef struct
{
    float kp;         // 比例增益
    float ki;         // 积分增益
    float kd;         // 微分增益
    float error;    // 当前误差
    float sum_error; // 积累的误差
    float last_error; // 上一次的误差
}ui_animation_param_t;


typedef struct Item Item_t;
typedef struct Page Page_t;

#define TITLE_LEN 12

// 列表项结构体
struct Item
{
    uint8_t pos; // 位置 序号
    char title[TITLE_LEN]; // 标题
    Page_t * local_page; // 所在界面
    ItemType_e item_type; // 列表类型 目录 or 文件
    Page_t * child_page; // 子界面 用作 ITEM_TREE
    Callback_t callback; // 回调函数 用作 ITEM_BLOB
    uint8_t *flag; // 开关量 用作 ITEM_SWITCH 和 ITEM_CHECKBOX

    Item_t * preItem;  // 前向列表
    Item_t * nextItem; // 后向链表
};

// 光标结构体
typedef struct Cursor
{
    uint8_t nowX; // 光标位置
    uint8_t nowY;   
    uint8_t nowW;
    uint8_t targetX; 
    uint8_t targetY;
    uint8_t targetW;     
    ui_animation_param_t cursor_ani;
}Cursor_t;

// 镜头结构体
typedef struct Camera
{
    uint8_t camera_pos; // 镜头位置
}Camera_t;


// 页面结构体
struct Page
{
    char title[TITLE_LEN]; // 标题
    uint8_t item_sum; // 列表项数量
    uint8_t cursor_pos; // 列表项序号
    Item_t * parent_item; // 页面的父项
    Item_t * item_head; // 列表头结点
    Item_t * item_tail; // 列表尾结点
};


// 菜单全局结构体
typedef struct
{
    MenuState_e menu_state; // 菜单状态
    Page_t * current_page; // 当前界面
    Item_t * current_item; // 当前列表项
    uint8_t page_refresh; // 页面刷新
    Cursor_t cursor; // 页面光标
    Camera_t camera; // 页面镜头
}Menu_t;



void menu_init(void);

void menu_add_page(Page_t * menu_page,char *title,uint8_t title_size);
void menu_add_item(Page_t * menu_page,Item_t * menu_item,char *title,uint8_t title_size,ItemType_e item_type,Page_t * child_page,Callback_t callback,uint8_t *flag);

void menu_loop(void);

#endif

